#!/bin/bash

MOD_NAME=plmnWhitelist
MOD_SETTINGS="/opt/$MOD_NAME/etc/settings"
GSMAT=/opt/$MOD_NAME/bin/gsmat
SYSLOG="/usr/bin/logger -t $MOD_NAME"

TMP_DIR=/tmp/$MOD_NAME
TMP_SCAN=$TMP_DIR/scan
TMP_SETTINGS=$TMP_DIR/settings

IFS=','
DEBUG=1

print_debug () {
  [ ! -z $DEBUG ] && /usr/bin/logger -t $MOD_NAME $1
}

print_info () {
  /usr/bin/logger -t $MOD_NAME $1
}

while true
do
  mkdir -p $TMP_DIR
  CURRENT_OPERATOR=$(status mobile | grep PLMN)
  . $MOD_SETTINGS
  # zjistime jestli jsme pripojeni k siti a pokud ano, jestli k
  # operatorovi z whitelistu
  RES=1
  for x in $MOD_PLMN_LIST
  do
    echo $CURRENT_OPERATOR | grep -q $x
    RES=$?
    [ $RES == 0 ] && break
  done

  if [ $RES == 0 ]
  then
    # jsme pripojeni k dobremu operatorovi
    print_debug "Correct operator"
    # service ppp nebezi
    if ! killall -0 mwan1d
    then
      print_debug "ppp is not running"
      $GSMAT AT+COPS=2 20
    fi
    sleep 20
    continue
  fi
  
  # nejsme pripojeni nebo ke spatnemu
  print_debug "Wrong operator"
  # deregistrujeme se a shodime spojeni
  $GSMAT AT+COPS=2 20
  echo "PPP_ENABLED=0" > $TMP_SETTINGS
  restore $TMP_SETTINGS
  service ppp restart

  # provedeme skenovani site
  ROUND=1
  while true
  do
    # pokud se scan nepovede 5x rebootujeme router
    [ $ROUND -ge 6 ] && reboot
    print_info "Scanning:"
    rm -f $TMP_SCAN
    $GSMAT AT+COPS=? 300 > $TMP_SCAN
    PLMNS=$(awk 'BEGIN { RS = "("; FS = ","} {print $4}' $TMP_SCAN)
    print_debug "Discovered PLMNs: $PLMNS"
    [ ! -z "$PLMNS" ] && break
    # scan se nepovedl
    print_info "Scan failed"
    gsmpwr on
    SLEEP_TIME=$(( 30 + ($ROUND-1)*15 ))
    ROUND=$(( $ROUND + 1 ))
    sleep $SLEEP_TIME
  done

  # pokusime se pripojit k siti
  RET=1
  . $MOD_SETTINGS

  for x in $MOD_PLMN_LIST
  do
    if echo $PLMNS | grep -q $x
    then
      print_info "Try PLMN: $x"
      echo -e "PPP_ENABLED=1\nPPP_OPERATOR=$x" > $TMP_SETTINGS
      restore $TMP_SETTINGS
      service ppp restart
      sleep 120
      status mwan | grep -q Uptime
      RET=$?
      [ $RET == 0 ] && break
    fi
  done

  if [ $RET == 1 ]
  then
    print_info "No suitable operator found."
    sleep 20
  fi                                    
done
